In [68]:
from SPARQLWrapper import SPARQLWrapper, JSON
import time, string, numpy as n, nltk as k
Definição de prefixos úteis para as consultas SparQL:
In [55]:
PREFIX="""PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ops: <http://purl.org/socialparticipation/ops#>
PREFIX opa: <http://purl.org/socialparticipation/opa#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/terms/>
PREFIX tsioc: <http://rdfs.org/sioc/types#>
PREFIX schema: <http://schema.org/>"""
Buscando todos os comentários no endpoint SparQL Fuseki/Jena com os dados do Participa.br:
In [56]:
NOW=time.time()
q="SELECT ?comentario ?titulo ?texto WHERE \
{?comentario dc:type tsioc:Comment.\
OPTIONAL {?comentario dc:title ?titulo . }\
OPTIONAL {?comentario schema:text ?texto .}}"
sparql3 = SPARQLWrapper("http://localhost:82/participabr/query")
sparql3.setQuery(PREFIX+q)
sparql3.setReturnFormat(JSON)
results4 = sparql3.query().convert()
print("%.2f segundos para puxar todos os comentários do Participa.br"%(time.time()-NOW,))
Limpando mensagens das sugeiras do BD:
In [57]:
msgs_=results4["results"]["bindings"]
msgs=[mm for mm in msgs_ if ("titulo" not in mm.keys()) or (("teste de stress" not in mm["titulo"]["value"].lower())
and ("comunidade de desenvolvedores e nesse caso, quanto mais" not in mm["texto"]["value"].lower()))]
Fazendo função para extrair atributos das mensagens:
In [58]:
import string, numpy as n
exclude = set(string.punctuation+u'\u201c'+u'\u2018'+u'\u201d'+u'\u2022'+u'\u2013')
def atributos(__msg):
texto=__msg["texto"]["value"]
texto_ = ''.join(ch for ch in texto if ch not in exclude)
palavras=texto_.split()
tams=[]
for palavra in palavras:
tams.append(len(palavra))
return len(tams), n.mean(tams), n.std(tams)
Criando vetor de atributos de cada mensagem:
In [66]:
atrs=[atributos(msg) for msg in msgs]
atrs_=n.array(atrs)
Fazendo seleção das mensagens que possuem entre 110 e 115 palavras:
In [67]:
max_palavras=115
min_palavras=110
n_msgs=((atrs_[:,0]>min_palavras)*(atrs_[:,0]<max_palavras)).sum()
print(u"são %i mensagens com mais de %i palavras e menos de %i"%
(n_msgs, min_palavras, max_palavras) )
Selecionando mensagens com média do tamanho da palavra maior que 6 caractéres:
In [61]:
msgs_i=((atrs_[:,0]>min_palavras)*(atrs_[:,0]<max_palavras)).nonzero()[0]
textos=[[msgs[i]["texto"]["value"] for i in msgs_i][j]
for j in (atrs_[msgs_i][:,1]>6.).nonzero()[0]]
for texto in textos: print texto+"\n======="
Selecionando mensagens com média do tamanho da palavra menor que 5 caractéres:
In [62]:
textos=[[msgs[i]["texto"]["value"] for i in msgs_i][j]
for j in (atrs_[msgs_i][:,1]<5.).nonzero()[0]]
for texto in textos: print texto+"\n======="
Fazendo contagem das palavras mais frequentes para seleção:
In [69]:
NOW=time.time()
palavras=string.join([i["texto"]["value"].lower() for i in msgs])
exclude = set(string.punctuation+u'\u201c'+u'\u2018'+u'\u201d'+u'\u2022'+u'\u2013')
palavras = ''.join(ch for ch in palavras if ch not in exclude)
palavras_=palavras.split()
print(u"feita lista de todas as palavras de todos os comentários em %.2f"%(time.time()-NOW,))
stopwords = set(k.corpus.stopwords.words('portuguese'))
palavras__=[pp for pp in palavras_ if pp not in stopwords]
fdist_=k.FreqDist(palavras__)
print("retiradas stopwords feita contagem das palavras em %.2f"%(time.time()-NOW,))
Fazendo seleção das 14 palavras mais incidentes nos comentários do Participa.br:
In [70]:
for fd,ii in [(fdist_[i],i) for i in fdist_.keys()[:14]]: print fd, ii